package br.ufpi.util;

import java.util.Date;

import org.joda.time.DateTime;
import org.joda.time.Duration;
import org.joda.time.Minutes;
import org.joda.time.Seconds;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class TimeDate {
	public static double getMinutos(Date start, Date end) {
		DateTime startConvertido = new DateTime(start);
		DateTime endConvertido = new DateTime(end);
		Duration duration = new Duration(startConvertido, endConvertido);
		double standardSeconds = duration.getStandardSeconds();
		double minutos = standardSeconds / 60;
		return minutos;
	}

	public static double getMinutos(DateTime start, DateTime end) {
		Duration duration = new Duration(start, end);
		double standardSeconds = duration.getStandardSeconds();
		double minutos = standardSeconds / 60;
		return minutos;
	}

	/**
	 * Adiciona a quantidade de minutos a hora atual
	 * 
	 * @param minutes
	 * @return
	 */
	public static DateTime addMinutes(int minutes) {
		DateTime dateTime = new DateTime();
		return dateTime.plus(Minutes.minutes(minutes));
	}

	/**
	 * Adiciona a quantidade de minutos a hora atual
	 * 
	 * @param minutes
	 * @return
	 */
	public static DateTime addSegundos(int seconds) {
		DateTime dateTime = new DateTime();
		return dateTime.plus(Seconds.seconds(seconds));
	}

	/**
	 * Adiciona a quantidade de segundos a hora passada
	 * 
	 * @param minutes
	 * @return
	 */
	public static DateTime addSegundos(int seconds, DateTime dateTime) {
		return dateTime.plus(Seconds.seconds(seconds));
	}

	/**
	 * Adiciona a quantidade de segundos a hora passada
	 * 
	 * @param minutes
	 * @return
	 */
	public static DateTime addSegundos(int seconds, Date date) {
		DateTime dateTime = new DateTime(date);
		return dateTime.plus(Seconds.seconds(seconds));
	}

	/**
	 * Obtem o numero de minutos passando apenas um date que só possui as
	 * horas,minutos e segundos. Retornando a diferença de minutos em relação ao
	 * horario momentaneo.
	 * 
	 * Usado para tarefas que tem horario que repetem o horario vários dias da
	 * semana
	 * 
	 * @param horas
	 * @return
	 */
	public static double getMinutos(Date horas) {
		DateTime horaAtual = new DateTime();
		DateTime diaConfigurado = TimeDate.transformaHorasDiaAtual(horas);
		return getMinutos(diaConfigurado, horaAtual);
	}

	public static DateTime transformaHorasDiaAtual(Date horas) {
		DateTime horaAtual = new DateTime();
		DateTime horasDateTime = new DateTime(horas);
		return horasDateTime.withDate(horaAtual.getYear(),
				horaAtual.getMonthOfYear(), horaAtual.getDayOfMonth());

	}

	public static String getDateView(Date data) {
		DateTime dt = new DateTime(data);
		DateTimeFormatter fmt = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm");
		return fmt.print(dt);
	}

	public static String getDateView(DateTime dt) {
		DateTimeFormatter fmt = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm");
		return fmt.print(dt);
	}

	public static String parseMinutos(double minutos) {
		int segundos = (int) (minutos * 60);
		Seconds seconds = Seconds.seconds(segundos);
		int minuto = seconds.toStandardMinutes().getMinutes();
		int segundo = segundos - minuto * 60;
		return "00:" + NumberUtils.intToString(minuto, 2) + ":"
				+ NumberUtils.intToString(segundo, 2);
	}
}
